///
/// \file     sql_annotations.hpp
/// \brief    Annotations for sql persistance
/// \author   Frederic Manisse
/// \version  1.0
///
/// Annotations for sql persistance
///
#ifndef LAURENA_SQL_ANNOTATIONS_H
#define LAURENA_SQL_ANNOTATIONS_H

/********************************************************************************/
/*                      pragma once support                                     */ 
/********************************************************************************/ 
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif

/********************************************************************************/ 
/*              dependencies                                                    */ 
/********************************************************************************/ 
#include <laurena/laurena.hpp>

/********************************************************************************/ 
/*              opening namespace(s)                                            */ 
/********************************************************************************/ 
namespace laurena {
namespace sql {

/********************************************************************************/ 
/* sql annotations                                                              */ 
/********************************************************************************/ 

class sql_column : public annotation
{
public:

	/****************************************************************************/ 
	/*		constants															*/ 
	/****************************************************************************/ 

	static const char* ANNOTATION_NAME;

	enum Flags
	{
		PRIMARY_KEY      = (1 << 0),
		AUTO_INCREMENT   = (1 << 1),
		UNIQUE           = (1 << 2),
		NOT_NULL         = (1 << 3),
	};


    /****************************************************************************/ 
    /*      constructor, destructor                                             */ 
    /****************************************************************************/ 
    sql_column (const char* column, word32 mask=0);

	/****************************************************************************/ 
	/*		getters																*/ 
	/****************************************************************************/ 
	inline const std::string& column() const { return this->_column; }
	inline bool  isPrimaryKey       () const { return this->_primary_key; }

	/****************************************************************************/ 
	/*		protected functions													*/ 
	/****************************************************************************/ 
	protected:

	virtual void annotated();
	virtual bool acceptDescriptable ();	

    /****************************************************************************/ 
    /*      protected datas                                                     */ 
    /****************************************************************************/ 
    protected:

	std::string					_column;
	bool                        _primary_key;
	bool                        _auto_increment;
	bool                        _unique;
	bool                        _not_null;



};

class sql_tablename : public annotation
{
public:    

	/****************************************************************************/ 
	/*		constants															*/ 
	/****************************************************************************/ 

	static const char* ANNOTATION_NAME;

    /****************************************************************************/ 
    /*      constructor, destructor                                             */ 
    /****************************************************************************/ 
    sql_tablename (const char* tablename);

	/****************************************************************************/ 
	/*		getters																*/ 
	/****************************************************************************/ 
	const std::string& tablename() const { return this->_tablename; }

	/****************************************************************************/ 
	/*		protected functions													*/ 
	/****************************************************************************/ 
	protected:

	virtual bool acceptDescriptable ();	

    /****************************************************************************/ 
    /*      protected datas                                                     */ 
    /****************************************************************************/ 
    protected:

	std::string			_tablename;
	const field*		_primary_key;

	friend sql_column;
};


/********************************************************************************/ 
/*          bottom file block                                                   */ 
/********************************************************************************/ 

}}
#endif
//end of file